#ifndef LOGGER_H
#define LOGGER_H

#include <stdio.h>
#include <time.h>
#include <stdarg.h>
#include <pthread.h> // For thread safety (using POSIX threads)
#include <string.h>
#include <errno.h>
#include <stdlib.h>

// 日志级别枚举
typedef enum {
    LOG_DEBUG = 0,
    LOG_INFO,
    LOG_WARN,
    LOG_ERROR,
    LOG_FATAL
} LogLevel;

// --- 全局配置声明 (定义在 logger.c 中) ---
extern LogLevel g_log_level; // 控制输出的最低日志级别
extern FILE *g_log_file;     // 日志文件指针
extern pthread_mutex_t g_log_mutex; // 用于保证线程安全的互斥锁

// --- 函数声明 ---

/**
 * @brief 初始化日志系统
 * @param level 最低日志级别
 * @param log_file_path 日志文件路径。如果为 NULL 或空字符串，则输出到 stderr。
 * @return 0 表示成功, -1 表示失败
 */
int log_init(LogLevel level, const char *log_file_path);

/**
 * @brief 关闭日志系统，释放资源
 */
void log_close();

/**
 * @brief 记录日志的核心函数 (主要由下面的宏调用)
 * @param level 当前消息的日志级别
 * @param file 源代码文件名 (__FILE__)
 * @param line 源代码行号 (__LINE__)
 * @param fmt 格式化字符串 (类似 printf)
 * @param ... 可变参数
 */
void log_write(LogLevel level, const char *file, int line, const char *fmt, ...);


// --- 便捷宏定义 ---
// 使用宏可以在编译时自动获取文件名和行号，并且方便按级别编译日志（如果需要更高级的控制）
// ##__VA_ARGS__ 是 GCC 特有的，用于处理可变参数为空的情况，更通用的方式是 __VA_ARGS__ (C99)
// 如果您的编译器不支持 ##__VA_ARGS__ 且可变参数可能为空，可能需要不同的宏定义或检查。
#define LOG_DEBUG(fmt, ...) log_write(LOG_DEBUG, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...)  log_write(LOG_INFO,  __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_WARN(fmt, ...)  log_write(LOG_WARN,  __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_ERROR(fmt, ...) log_write(LOG_ERROR, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_FATAL(fmt, ...) log_write(LOG_FATAL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

#endif // LOGGER_H